package com.example.java_chatroom.api;

import com.example.java_chatroom.component.CommonSession;
import com.example.java_chatroom.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 消息会话类
 */
@Slf4j
@RestController
public class MessageSessionAPI {

    /**
     * 消息会话mapper
     */
    @Resource
    private MessageSessionMapper messageSessionMapper;

    /**
     * 消息mapper
     */
    @Resource
    private MessageMapper messageMapper;

    /**
     * session公共服务类
     */
    @Resource
    private CommonSession commonSession;

    /**
     * 获取会话列表
     * @param req       http请求
     * @return      响应一个 MessageSession 对象数组
     */
    @GetMapping("/sessionList")
    @ResponseBody
    public Object getMessageSessionList(HttpServletRequest req) {
        List<MessageSession> messageSessionList = new ArrayList<>();
        User user = commonSession.getUserBySession(req, "getMessageSessionList");
        // 如果user为null，则直接返回
        if (null == user) {
            return messageSessionList;
        }
        // 2. 根据当前登录的 userId 查询数据库, 查出来有哪些会话id
        List<Integer> sessionIdList = messageSessionMapper.getSessionIdsByUserId(user.getUserId());
        // 遍历整个会话id列表，做一系列操作
        for (int sessionId : sessionIdList) {
            MessageSession messageSession = new MessageSession();
            messageSession.setSessionId(sessionId);
            // 3. 遍历会话id, 查询出每个会话里涉及到的好友都有谁
            List<Friend> friends = messageSessionMapper.getFriendsBySessionId(sessionId, user.getUserId());
            messageSession.setFriends(friends);
            // 4. 遍历会话id, 查询出每个会话的最后一条消息
            //    有可能出现按照会话 id 查不到消息的情况 (新创建的会话可能还没来得及发消息呢
            String lastMessage = messageMapper.getLastMessageBySessionId(sessionId);
            // 如果为空，则最后一条消息默认为空字符串
            if (lastMessage == null) {
                messageSession.setLastMessage("");
            }
            // 将最后一条消息设置进去
            else {
                messageSession.setLastMessage(lastMessage);
            }
            // 将当前封装的会话对象放到最后返回的会话对象列表中
            messageSessionList.add(messageSession);
        }
        // 最终目标就是构造出一个 MessageSession 对象数组
        return messageSessionList;
    }


    /**
     * 添加一个微信消息会话
     * @param toUserId      发送消息对象是谁
     * @param user          自己
     * @return      返回创建好的会话对象
     */
    @PostMapping("/session")
    @ResponseBody
    @Transactional
    public Object addMessageSession(int toUserId, @SessionAttribute("user") User user) {
        HashMap<String, Integer> resp = new HashMap<>();
        // 进行数据库的插入操作
        // 1. 先给 message_session 表里插入记录. 使用这个参数的目的主要是为了能够获取到会话的 sessionId
        //    换而言之, MessageSession 里的 friends 和 lastMessage 属性此处都用不上.
        // 写入一条消息会话数据
        MessageSession messageSession = new MessageSession();
        messageSessionMapper.addMessageSession(messageSession);
        // 2和3就是关联user表，写入两条记录，就是这个会话现在属于哪两个人的
        // 2. 给 message_session_user 表插入记录.
        MessageSessionUserItem item1 = new MessageSessionUserItem();
        item1.setSessionId(messageSession.getSessionId());
        item1.setUserId(user.getUserId());
        messageSessionMapper.addMessageSessionUser(item1);
        // 3. 给 message_session_user 表插入记录.
        MessageSessionUserItem item2 = new MessageSessionUserItem();
        item2.setSessionId(messageSession.getSessionId());
        item2.setUserId(toUserId);
        messageSessionMapper.addMessageSessionUser(item2);

        log.info("[addMessageSession] 新增会话成功! sessionId={}, userId1={}, userId2={}",
                messageSession.getSessionId(), user.getUserId(), toUserId);

        // 将会话id响应回去，前端也保存记录1        resp.put("sessionId", messageSession.getSessionId());
        // 返回的对象是一个普通对象也可以, 或者是一个 Map 也可以, jackson 都能进行处理.
        return resp;
    }
}
